/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import connection.Conexao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import model.Operador;

/**
 * Define as regras de manipulação de dados para o banco de operadores;
 * @author Janio Luiz Antunes
 * @author Marcel Vinicius Kohls
 * @see http://code.google.com/p/sysdesk-java/
 *
 */
public class DAOOperador {
    private final String SQL_ORDER = " ORDER BY ope_nome";
    private final String SQL_LISTA_OPERADORES = "SELECT a.ope_codigo, a.ope_nome, b.fun_nome, c.cat_descricao, a.ope_telefone, a.ope_email FROM operadores a, funcao b, categorias c WHERE ope_fun_codigo = fun_codigo AND ope_cat_codigo = cat_codigo AND ope_excluido=false";
    private final String SQL_LISTA_OPERADORES_POR_FUNCAO = "SELECT a.ope_codigo, a.ope_nome, b.fun_nome, c.cat_descricao, a.ope_telefone, a.ope_email FROM operadores a, funcao b, categorias c WHERE ope_fun_codigo = fun_codigo AND ope_cat_codigo = cat_codigo AND ope_excluido=false AND ope_fun_codigo = ?";
    private final String SQL_LISTA_OPERADORES_POR_CATEGORIA = "SELECT a.ope_codigo, a.ope_nome, b.fun_nome, c.cat_descricao, a.ope_telefone, a.ope_email FROM operadores a, funcao b, categorias c WHERE ope_fun_codigo = fun_codigo AND ope_cat_codigo = cat_codigo AND ope_excluido=false AND ope_cat_codigo = ? ORDER BY ope_nome";
    private final String SQL_BUSCA_POR_CODIGO = "SELECT a.ope_codigo, a.ope_nome, a.ope_fun_codigo, b.fun_nome, a.ope_cat_codigo, c.cat_descricao, a.ope_telefone, a.ope_email, a.ope_excluido from operadores a, funcao b, categorias c WHERE ope_fun_codigo = fun_codigo AND ope_cat_codigo = cat_codigo AND ope_codigo = ?";
    private final String SQL_ALTERAR = "UPDATE operadores set ope_cat_codigo=?, ope_nome=?, ope_fun_codigo=?, ope_telefone=?, ope_email=? WHERE ope_codigo = ?";
    private final String SQL_INCLUIR = "INSERT INTO operadores (ope_cat_codigo, ope_nome, ope_fun_codigo, ope_telefone, ope_email, ope_excluido) VALUES (?,?,?,?,?,false)";
    private final String SQL_EXCLUIR = "UPDATE operadores set ope_excluido=true where ope_codigo=?";

    public final int OPE_NONE       = -1;
    public final int OPE_ATENDENTE  = 1;
    public final int OPE_ANALISTA   = 2;

    /**
     * Retorna um resultSet com o resultado do comando de sql da lista das operadores. Opcoes de parametros para esta lista: OPE_NONE, OPE_ATENDENTE, OPE_ANALISTA
     * @return
     * @throws Exception
     */
    public ResultSet getListaOperadores(int pCodigoFuncao, String pNomeOperador) throws Exception {
        PreparedStatement sqlQuery = null;

        String sqlNomeOperador = " ";

        //prepara filtro categoria se desejar
            if (pNomeOperador != null && pNomeOperador != "null" && pNomeOperador.trim().length() > 0) {
                sqlNomeOperador = " AND ope_nome LIKE \'"+pNomeOperador+"%\'";                
            }
            
        try {
            if (pCodigoFuncao == -1) {                
                return Conexao.getStatement().executeQuery(SQL_LISTA_OPERADORES+sqlNomeOperador+SQL_ORDER);
            } else {                
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_LISTA_OPERADORES_POR_FUNCAO+sqlNomeOperador+SQL_ORDER);
                sqlQuery.setInt(1,  pCodigoFuncao );

                return sqlQuery.executeQuery();
            }

        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}
    }

    /**
     * Retorna um resultSet com o resultado do comando de sql da lista das operadores
     * @return
     * @throws Exception
     */
    public ResultSet getListaOperadoresPorCategoria(int pCodigoCategoria) throws Exception {
        PreparedStatement sqlQuery = null;

        try {
            if (pCodigoCategoria > 0) {
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_LISTA_OPERADORES_POR_CATEGORIA);
                sqlQuery.setInt(1,  pCodigoCategoria);
            }

            return sqlQuery.executeQuery();

        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}
    }

    /**
     * retorna uma instancia de operador a partir de uma busca no sql
     * pelo código passado como parametro.
     * @param pCodOperador
     * @return
     * @throws Exception
     */
    public Operador getOperadorPorCodigo(int pCodOperador) throws Exception {
        PreparedStatement sqlQuery = null;
        ResultSet sqlResult = null;
        Operador resultadoOperador = new Operador();

        try {
            sqlQuery  = Conexao.getConnection().prepareStatement(SQL_BUSCA_POR_CODIGO);
            sqlQuery.setInt(1,  pCodOperador );
            System.out.println( sqlQuery.toString() );
            sqlResult = sqlQuery.executeQuery();

            resultadoOperador = getValorDoResultado(sqlResult);

            return resultadoOperador;
        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}
    }

    /**
     * monta um objeto do tipo operador, baseado em um retorno de pesquisa de sql em operadores
     * @param pSqlResult
     * @return
     */
    public Operador getValorDoResultado(ResultSet pSqlResult) throws Exception {
        Operador objetoRetorno = new Operador();

        try {

            // apenas define os campos do objeto se realmente retornou resultado
            if (pSqlResult.next()){
                objetoRetorno.setCodigo(pSqlResult.getInt("ope_codigo"));
                objetoRetorno.setCodCategoria(pSqlResult.getInt("ope_cat_codigo"));
                objetoRetorno.setNome(pSqlResult.getString("ope_nome"));
                objetoRetorno.setCodFuncao(pSqlResult.getInt("ope_fun_codigo"));
                objetoRetorno.setDescFuncao(pSqlResult.getString("fun_nome"));
                objetoRetorno.setDescCategoria(pSqlResult.getString("cat_descricao"));
                objetoRetorno.setTelefone(pSqlResult.getString("ope_telefone"));
                objetoRetorno.setEmail(pSqlResult.getString("ope_email"));
                objetoRetorno.setExcluido(pSqlResult.getBoolean("ope_excluido"));
            }

        } catch (Exception e) {
            System.out.println("erro: getValorDoResultado: "+e.getMessage());
        }

        return objetoRetorno;
    }

    /**
     * define a flag de excluido de um operador.
     * @param pCodigoOperador
     * @return Retorna TRUE se a operacao foi concluída, e FALSE se deu algum erro
     */
    public Boolean excluir(int pCodigoOperador) throws Exception {
        PreparedStatement sqlQuery = null;
        Boolean resultado = false;

        try {
            // prepara o SQL conforme a instancia recebida
            if (pCodigoOperador != 0) {
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_EXCLUIR);

                sqlQuery.setInt(1, pCodigoOperador);

                System.out.println("DAOOperador.Excluir:");
                System.out.println(sqlQuery.toString());
            }

            sqlQuery.executeUpdate();

            resultado = true;
        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}

      return resultado;
    }

    /**
     * Salva uma instância de operador no banco. Se tiver código então é uma alteração,
     * se o código for null, então é inclusão.
     * @param pOperador
     * @return Retorna TRUE se a operacao foi concluída, e FALSE se deu algum erro
     */
    public Boolean salvar(Operador pOperador) throws Exception {
        PreparedStatement sqlQuery = null;
        Boolean resultado = false;

        try {
            // prepara o SQL conforme a instancia recebida
            if (pOperador.getCodigo() != 0) {
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_ALTERAR);

                sqlQuery.setInt(1, pOperador.getCodCategoria());
                sqlQuery.setString(2, pOperador.getNome());
                sqlQuery.setInt(3, pOperador.getCodFuncao());
                sqlQuery.setString(4, pOperador.getTelefone());
                sqlQuery.setString(5, pOperador.getEmail());

                sqlQuery.setInt(6, pOperador.getCodigo());

                System.out.println("DAOOperador.Salvar(Alterar):");
                System.out.println(sqlQuery.toString());
            }
            // prepara SQL para incluir
            else {
                sqlQuery  = Conexao.getConnection().prepareStatement(SQL_INCLUIR);

                sqlQuery.setInt(1, pOperador.getCodCategoria());
                sqlQuery.setString(2, pOperador.getNome());
                sqlQuery.setInt(3, pOperador.getCodFuncao());
                sqlQuery.setString(4, pOperador.getTelefone());
                sqlQuery.setString(5, pOperador.getEmail());

                System.out.println("DAOOperador.Salvar(Incluir):");
                System.out.println(sqlQuery.toString());
            }

            sqlQuery.executeUpdate();

            resultado = true;
        }catch(SQLException sqle){
            throw new Exception(sqle);
        } catch(Exception e){
            throw new Exception(e);
        } finally{}

      return resultado;
    }

}
